package utils

import (
	"fmt"
	"os"
	"path/filepath"
	"regexp"
	"strconv"
	"strings"
	"time"
)

// 解析文件名，返回路径、文件名、文件后缀、无后缀文件名
func parseFile(全名 string) (string, string, string, string) {
	fmt.Printf("全名:%s\n", 全名)
	路径 := filepath.Dir(全名)
	fmt.Printf("路径:%s\n", 路径)
	文件名 := filepath.Base(全名)
	后缀 := filepath.Ext(文件名)
	无后缀文件名 := 文件名[:len(文件名)-len(后缀)]
	return 路径, 文件名, 后缀, 无后缀文件名
}

// 生成唯一文件名
func A生成唯一文件名_ly(全名 string, 关键词 string) string {
	路径, _, 后缀, 无后缀文件名 := parseFile(全名)
	fmt.Printf("路径：%s\n", 路径)

	数字序号 := 1

	err := filepath.Walk(路径, func(路径 string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if info.IsDir() {
			return nil
		}
		文件名 := filepath.Base(路径)
		reg := fmt.Sprintf("%s_%s+(\\d+)", 无后缀文件名, 关键词)
		r, _ := regexp.Compile(reg)
		if r.MatchString(文件名) {
			matches := r.FindStringSubmatch(文件名)
			if len(matches) > 1 {
				序号, err := strconv.Atoi(matches[1])
				if err == nil && 序号 >= 数字序号 {
					数字序号 = 序号 + 1
				}
			}
		}
		return nil
	})
	if err != nil {
		fmt.Println(err)
	}

	短名称 := fmt.Sprintf("%s_%s%d%s", 无后缀文件名, 关键词, 数字序号, 后缀)
	唯一名 := filepath.Join(路径, 短名称)
	唯一名 = A成正斜杠(唯一名)

	fmt.Printf("唯一名: %s\n", 唯一名)

	return 唯一名
}

func A生成唯一文件夹_ly(全名 string, keyword string) string {
	fmt.Printf("A生成唯一文件夹_ly 接收到的全名 👉 %+v\n", 全名)
	路径, _, _, 无后缀文件名 := parseFile(全名)

	数字序号 := 1

	todayDate := time.Now().Format("2006-01-02")
	folderPath := fmt.Sprintf("%s/导出dxf_%s", 路径, todayDate)

	err := os.MkdirAll(folderPath, os.ModePerm)
	if err != nil {
		fmt.Println(err)
	}

	err = filepath.Walk(folderPath, func(路径 string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() {
			return nil
		}
		文件夹名 := filepath.Base(路径)
		reg := fmt.Sprintf("%s_%s(\\d+)", 无后缀文件名, keyword)
		r, _ := regexp.Compile(reg)
		if r.MatchString(文件夹名) {
			matches := r.FindStringSubmatch(文件夹名)
			if len(matches) > 1 {
				序号, err := strconv.Atoi(matches[1])
				if err == nil && 序号 >= 数字序号 {
					数字序号 = 序号 + 1
				}
			}
		}
		return nil
	})
	if err != nil {
		fmt.Println(err)
	}

	uniqueName := fmt.Sprintf("%s/%s_%s%d", folderPath, 无后缀文件名, keyword, 数字序号)

	err = os.MkdirAll(uniqueName, os.ModePerm)
	if err != nil {
		fmt.Println(err)
	}
	uniqueName = A成正斜杠(uniqueName)
	fmt.Printf("go 返回的A生成唯一文件夹_ly uniqueName 👉 %+v\n", uniqueName)
	return uniqueName
}

// 将路径中的反斜杠替换为正斜杠
func A成正斜杠(str string) string {
	res := strings.ReplaceAll(str, "\\", "/")
	return res
}
